<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原型总结</title>
</head>
<body>
    <button onclick="this.lh_hide();">后盾人</button>
</body>
</html>

<script>
    //给最顶层的原型对象添加方法  就可以直接使用了
    //但是不建议这样做，项目牵扯问题不多的话  
    //但是存在如果用了很多库的话会存在冲突问题
    Object.prototype.lh_hide = function(){
        this.style.display = 'none';
    }


    //使用对象的原型只是可以知道，可以直接给原型添加自定义方法，所以可以这样使用
    String.prototype._substr = function(len = 5){
        return this.length <= 5 ? this : this.substr(0,len)+'.'.repeat(3);
    }

    //不能将系统对象的原型属性直接重新定义  否则会造成死循环
    console.log("厚度柔嫩人呢能二人"._substr());





    //函数也是对象也有原型    函数有prototype 属性指向他的原型
    //为构造函数设置的原型指的是，当使用构造函数创建对象的时候吧这个原型赋值给这个对象了

/*
    function User(name){
        this.name = name;
        // this.show = function(){
        //     return this.name;
        // }
    }

    User.prototype.show = function(){
        return this.name;
    }

    //每次实例化的时候都会有一个show方法   会占用内存 为了减少内存  还是吧对象都给父级对象
    let xj = new User("向军");
    let lh = new User("刘皓");
    // console.log(lh.__proto__.show.call(xj));
    console.log(lh.show());
    
*/

//函数默认prototype只包含一个属性constructor的对象，constructor指的是当前的构造函数
// function User(name){
//     this.name = name;
// }
// let xj = new User('向军');
// // console.log(xj);
// // console.dir(User.prototype.constructor == User);
// // console.log(xj.__proto__ == User.prototype)

// let lisi = new xj.__proto__.constructor("李四");
// console.log(xj.__proto__ == lisi.__proto__);


// //原型中保存引用类型会造成对象共享属性，一般在原型中定义方法
// function User(){}

// User.prototype = {
//     lessons : ["JS","VUE"]
// };

// const lisi = new User();
// const wangwu = new User();
// // console.log(lisi);
// // console.log(wangwu);


// //修改一个对象原型的时候   其他的也就修改了
// lisi.lessons.push("CSS");
// console.log(lisi.lessons)
// console.log(wangwu.lessons);


//为Object原型对象添加方法，将影响所有的函数














    
</script>
